home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / source / src / graph / _g_misc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-16  |  2.8 KB  |  154 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  _g_misc.c
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #include <LEDA/graph.h>
  16. #include <LEDA/ugraph.h>
  17.  
  18.  
  19.  
  20.  
  21. node_array<int>* num_ptr;
  22.   
  23. int epe_source_num(const edge& e) { return (*num_ptr)[source(e)]; }
  24. int epe_target_num(const edge& e) { return (*num_ptr)[target(e)]; }
  25.  
  26.  
  27. bool Is_Simple(graph& G)  
  28.   // return true iff G is simple, i.e, has no parallel edges
  29.  
  30.   list<edge>el= G.all_edges();
  31.   node v;
  32.   
  33.   edge e;
  34.   int n= 0;
  35.   
  36.   node_array<int> num(G);
  37.   forall_nodes(v,G) num[v]= n++;
  38.   
  39.   num_ptr= #
  40.   
  41.   el.bucket_sort(0,n-1,&epe_source_num);
  42.   el.bucket_sort(0,n-1,&epe_target_num);
  43.   
  44.   int i= -1;
  45.   int j= -1;
  46.   
  47.   forall(e,el)
  48.   { if(j==num[source(e)]&&i==num[target(e)])
  49.     return false;
  50.     else
  51.     { j= num[source(e)];
  52.       i= num[target(e)];
  53.     }
  54.   }
  55.   return true;
  56.   
  57. }
  58.   
  59.   
  60.   
  61.  
  62. void Make_Simple(graph& G)
  63.   //use bucket sort to find and eliminate parallel edges
  64.   
  65.   list<edge> el = G.all_edges();
  66.   node v;
  67.   edge e;
  68.   int  n = 0;
  69.  
  70.   node_array<int> num(G);
  71.   forall_nodes(v,G) num[v] = n++;
  72.   
  73.   num_ptr = #
  74.  
  75.   el.bucket_sort(0,n-1,&epe_source_num);
  76.   el.bucket_sort(0,n-1,&epe_target_num);
  77.   
  78.   int i = -1;
  79.   int j = -1; 
  80.   forall(e,el)  
  81.     { if (j==num[source(e)] && i==num[target(e)]) 
  82.         G.del_edge(e);
  83.       else 
  84.         { j=num[source(e)];
  85.           i=num[target(e)];
  86.          }
  87.      }
  88.   
  89.  }
  90.  
  91.  
  92.  
  93.  
  94. static int edge_ord1(const edge& e) { return index(source(e)); }
  95. static int edge_ord2(const edge& e) { return index(target(e)); }
  96.  
  97. bool Is_Bidirected(const graph& G, edge_array<edge>& reversal)     
  98. {
  99.  // computes for every edge e = (v,w) in G its reversal reversal[e] = (w,v)
  100.  // in G ( nil if not present). Returns true if every edge has a
  101.  // reversal and false otherwise.
  102.  
  103.   int n = G.max_node_index();
  104.   int count = 0;
  105.  
  106.   edge e,r;
  107.  
  108.   forall_edges(e,G) reversal[e] = 0;
  109.  
  110.   list<edge> El = G.all_edges();
  111.   El.bucket_sort(0,n,&edge_ord2);
  112.   El.bucket_sort(0,n,&edge_ord1);
  113.   
  114.   list<edge> El1 = G.all_edges();
  115.   El1.bucket_sort(0,n,&edge_ord1);
  116.   El1.bucket_sort(0,n,&edge_ord2);
  117.  
  118.  
  119.   // merge El and El1 to find corresponding edges
  120.  
  121.   while (! El.empty() && ! El1.empty())
  122.   { e = El.head();
  123.     r = El1.head();
  124.  
  125.     if (target(r) == source(e))
  126.       if (source(r) == target(e))
  127.          { reversal[e] = r;
  128.            El1.pop();
  129.            El.pop();
  130.            count++;
  131.           }
  132.       else
  133.          if (index(source(r)) < index(target(e)))
  134.              El1.pop();
  135.          else
  136.              El.pop();
  137.  
  138.     else
  139.       if (index(target(r)) < index(source(e)))
  140.           El1.pop();
  141.       else
  142.           El.pop();
  143.  
  144.     }
  145.  
  146.   return (count == G.number_of_edges()) ? true : false;
  147.  
  148. }
  149.  
  150.  
  151.